<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //生成器其实是一个特殊的函数
        //异步编程
        // function* gen() {
        //         // console.log(111);
        //         yield '一只没有耳朵'; //函数代码的分割符
        //         // console.log(222);
        //         yield '一只没有尾巴'
        //         // console.log(333);
        //         yield '真奇怪'
        //         // console.log(444);

        //     }
        //     // let iterator = gen();
        //     // iterator.next();
        //     // iterator.next();
        //     // iterator.next();
        //     // iterator.next();
        //     //遍历
        // for (let v of gen()) {
        //     console.log(v);
        // }

        //生成器函数参数

        // function* gen(arg) {
        //         console.log(arg);
        //         let one = yield 111;
        //         console.log(one);
        //         let two = yield 222;
        //         console.log(two);
        //         let three = yield 333;
        //         console.log(three);
        //     }
        //     //执行获取迭代器对象
        // let iterator = gen('AAA');
        // console.log(iterator.next());
        // //next方法可以传入实参
        // console.log(iterator.next('BBB')); //next() 方法中传参，参数将作为上一个yield语句的返回结果
        // console.log(iterator.next('CCC'));
        // console.log(iterator.next('DDD'));

        //生成器函数的异步实例一：
        // function one() {
        //     setTimeout(() => {
        //         console.log(111);
        //         app.next()
        //     }, 1000)
        // }

        // function two() {
        //     setTimeout(() => {
        //         console.log(222);
        //         app.next()
        //     }, 2000)
        // }

        // function three() {
        //     setTimeout(() => {
        //         console.log(333);
        //         app.next()

        //     }, 3000)
        // }

        // function* gen() {
        //     yield one()
        //     yield two()
        //     yield three()
        // }
        // let app = gen()
        // app.next();

        //生成器函数的异步实例二:
        function getUsers() {
            setTimeout(() => {
                let data = '用户数据';
                //调用next方法，并将数据传入
                iterator.next(data); //第二次调next()方法，它的实参作为第一个yield语句的返回结果
            }, 1000);
        }

        function getOrders() {
            setTimeout(() => {
                let data = '订单数据';
                iterator.next(data);
            }, 1000);
        }

        function getGoods() {
            setTimeout(() => {
                let data = '商品数据';
                iterator.next(data);
            }, 1000);
        }

        function* gen() {
            let users = yield getUsers();
            // console.log(users);
            let orders = yield getOrders();
            // console.log(orders);
            let goods = yield getGoods();
            // console.log(goods);
        }
        let iterator = gen();
        iterator.next();
    </script>
</body>

</html>